简单来说,就是一个模仿lang8的网站。自己想要了解自己实现的话要花多久。实际上确实花了很久,特别是批改网站核心的批改页面。
代码在这里 https://github.com/xnnyygn/report8
模型不难
围绕Report为核心。上传报告后分解为句子。然后针对句子批改。每次批改会有一个批改号。并在单独表中记录批改操作用于排序等。
句子分解
DELIMITERS = Set.new(%w{。 ! . ?}) def split_text(text) sentences = [] sentence = '' text.chars do |c| if c == ?\n or c == ?\r sentence << ' ' elsif DELIMITERS.include? c sentence << c sentences << sentence.strip sentence = '' else sentence << c end end sentence.strip! sentences << sentence unless sentence.empty? sentences end
批改页面的编辑器使用tinymce,个人感觉不tiny。编辑器设置(coffeescript)
tinymce.init selector: ".sentence-editor", theme: 'advanced', theme_advanced_resizing : true, theme_advancedabuttons1: 'undo,redo,|,strikethrough,forecolor,|,removeformat', theme_advanced_text_colors : 'FF0000,0000FF,000000', theme_advanced_default_foreground_color : '#FF0000', theme_advanced_more_colors : false, width: '100%', content_css: '/assets/sentence-editor.css'
最后的content_css可能是错误的,实际不能像我这么写。
批改界面上按钮比较多,有修改,撤销,保存,移除,重置等。这几个按钮之间的交互js花了挺长时间的。还有提交的表单是复杂表单,看一下保存处理就明白了。
def save_corrections # generate sentence map sentence_map = {} @report.sentences.each do |s| sentence_map[s.id] = s end # filter corrections corrections = [] params[:corrections].each do |id, c| sentence_key = id.to_i correction_data = {} if c[:modified] == 'true' and sentence_map.include? sentence_key correction_data[:sentence] = sentence_map[sentence_key] correction_data[:advice] = c[:advice] correction_data[:comment] = c[:comment] correction_data[:advisor] = @current_user corrections << correction_data end end if corrections.any? Report.transaction do # save correction log log = CorrectionLog.new log.report = @report log.advisor = @current_user log.save # save corrections corrections.each do |c| c[:correction_log] = log correction = Correction.new(c) correction.save end # update correction count in report @report.correction_count = CorrectionLog.where(report: @report).count @report.save # send mail if @report.author != @current_user CorrectionNotifier.received(@report.author, @current_user, @report).deliver end end end redirect_to @report end
不过把这个大页面做完之后,剩下的相对就简单多了。比如新增页面,界面语言设置页面(国际化)。
实际上网站还可以发邮件,不过用的是Rails默认的测试邮箱,没发出来。
另外还有个PV功能,使用Redis。相对简单。不过实际网站中被我禁用了。Redis貌似在Rails中不能降级使用?
最后是一张首页图。为啥最后放,因为自己的界面设计实属一般……